//2024.03.03  22:13 星期日 阴 心情总感觉 空虚 不开心 少了 好多东西 丢了好多东西 好像是压力大了...
/**
 * 这个代码 是 写 高亮提示组件 可以添加到 指定元素 位置 或者 全局 或者 伪元素
 * 旨在 将该元素 进行高亮 位置 显示 添加光晕
 */
// 怎么设计?
// targetEl : 光效 指定元素  useLightEl() 使用元素
// elLightCss :光效  addLightCss() 添加样式 useLightCss() 使用样式
// appendLightEl() :放置光效
// lightNode() : 添加 指定 Class 意欲 是 lightNode 的元素 返回 单 对象 操作

import {
  ObjectOnlyPushSet,
  removeClass,
  toStringTypeCheck,
} from '../../components/aaanewApp/global/global';

const usedLightCss = 'usedLightCss';

/**
 * lightNode Impact 磁吸 冲积平原
 *
 * 所有信息 会在此存入
 *
 * 唯一值 是 元素的 id 名称
 */
let lightNodeImp = { data: [] };

// let data = 'data';

/**
 * 将 指定元素 设置为 lightNode 可操作对象
 * @param {any} el element 或者 elID 或者 undefined (-- 返回 操作信息集)
 */
function lightNode(el) {
  let lightObj = {
    node: undefined,
    usedLightCss: [],
    useLightEl,
    addLightCss,
    removeLightCss,
    callFunc,
  };

  //   只是 创建 管理 信息集
  if (el == undefined) {
    return lightObj;
  }
  lightObj.useLightEl(el);

  let elID = lightObj['node'].id;
  //   添加信息 到 lightNodeImp lightNode 冲积平原
  //   lightNodeImp[data].push(elID)
  //   lightNodeImp[elID]=lightObj
  ObjectOnlyPushSet(lightNodeImp, elID, lightObj);

  return lightObj;
}

/**
 * 更替 lightNode 指定元素对象
 *
 * 删除 元素 的 所有 lightClass
 *
 * 添加 元素 上一届的  lightclass
 * @param {Object|String} el element 或者 elID
 * @returns -- boolean 返回 是否 更替 lightNode 元素对象 成功
 */
function useLightEl(el) {
  //   console.log(this);
  if (toStringTypeCheck(el, 'string')) {
    el = document.getElementById(el);
    if (el == undefined) {
      console.log('标注 LightNode 信息 失败 : 未找到 ' + el + '元素');

      return false;
    }
  }

  //   删除 元素 的 所有 lightClass
  this.removeLightCss(this['usedLightCss']);

  this['node'] = el;

  //添加 元素 上一届的  lightclass
  this.addLightCss(this['usedLightCss']);

  return true;
}

/**
 * 批量 添加 相关 lightNode 的 light Class  进行管理
 * @param {string|Array} CssClass class  类名 可以采用 数组
 */
function addLightCss(CssClass) {
  if (toStringTypeCheck(CssClass, 'array')) {
    let a = [...CssClass];
    for (let i = 0; i < a.length; i++) {
      addLightCss(a[i]);
    }
  }
  if (toStringTypeCheck(CssClass, 'string')) {
    this[usedLightCss].push(CssClass);
    removeClass(this['node'], CssClass, true);
  }
}

/**
 * 批量 删除 相关 lightNode 的 light Class
 * @param {string|Array} CssClass class  类名 可以采用 数组
 */
function removeLightCss(CssClass) {
  if (toStringTypeCheck(CssClass, 'array')) {
    let a = [...CssClass];
    for (let i = 0; i < a.length; i++) {
      addLightCss(a[i]);
    }
  }
  if (toStringTypeCheck(CssClass, 'string')) {
    let ind = this[usedLightCss].indexOf(CssClass);
    this[usedLightCss].splice(ind, 1);
    removeClass(this['node'], CssClass);
  }
}

/**
 * 用户自定义 函数
 *
 * 后面 以 call 的形式 带上参数
 *
 * 绑定 其 this 为 当前元素的 LightNode
 * @param {Function} userFunc 用户 自定义函数
 */
function callFunc(userFunc) {
  if (!toStringTypeCheck(userFunc, 'function')) {
    return false;
  }
  let arg = [...arguments];
  arg.shift();
  return userFunc.call(this, ...arg);
}

/**
 * 获取 当前 的 所有 高亮节点信息
 *
 * 可以进行 热更新 高亮节点信息
 * @param {Boolean} renew 是否启用热更新 将 部分 不在线 的信息 进行删除
 * @returns --{object}  所有 高亮节点信息
 */
function getlightNodeImp(renew) {
  if (renew) {
    let el_i;
    for (let i = 0; i < lightNodeImp['data'].length; i++) {
      el_i = document.getElementById(lightNodeImp['data'][i]);

      // 如果当前元素 还存在 或者 为 global 全局 作用域下
      if (el_i != undefined) {
        continue;
      }
      // 删除 当前页面 未有 元素 的 吸附作用域
      delete lightNodeImp[lightNodeImp['data'][i]];
      lightNodeImp['data'].splice(i, 1);
    }
  }
  return lightNodeImp;
}

export { lightNode, getlightNodeImp };
